package algo3c3g3.model.material;

import algo3c3g3.model.*;

/**
 * Representa los posibles materiales de los que puede estar hecho un bloque.
 */
public abstract class Material
{
    /**
     * Nombres de material usados para crear instancias.
     */
    public static final String
        AIR = "Air",
        BLACK_HOLE = "BlackHole",
        BRIDGE = "Bridge",
        FIRE = "Fire",
        GROUND = "Ground",
        ICE = "Ice",
        ROCK = "Rock",
        INVISIBLE_BLOCK = "InvisibleBlock";
    
    /**
     * Indica si el bloque correspondiente a este material es solido o no.
     * Si es solido no permite el paso de las unidades.
     * @return true si es un bloque solido.
     */
    public abstract boolean isSolid();
    
    /**
     * Indica si el bloque de este material puede ser destruido por
     * una accion de una unidad.
     * @return true si el bloque es destructible.
     */
    public abstract boolean isBreakable();
    
    /**
     * Efecto que se ejecuta sobre la unidad al estar en contacto horizontalmente
     * con un bloque de este material.
     */
    public void affectUnitX(Unit unit) {}
    
    /**
     * Efecto que se ejecuta sobre la unidad al estar en contacto verticalmente
     * con un bloque de este material.
     */
    public void affectUnitY(Unit unit) {}
}
